package main

import (
	"fmt"
	"strings"
)

/*
	字符串中的第一个唯一字符
给定一个字符串，找到它的第一个不重复的字符，并返回它的索引。如果不存在，则返回 -1。

示例：
s = "leetcode

返回 0
s = "loveleetcode"
返回 2
 */

//type Uint8Sort []uint8
//
//func (p Uint8Sort) Len() int           { return len(p) }
//func (p Uint8Sort) Less(i, j int) bool { return p[i] < p[j] }
//func (p Uint8Sort) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }

func firstUniqChar(s string) int {
	// 先排序
	// 自定义字符串排序算法
	//arr := []byte(s)
	//sort.Sort(Uint8Sort(arr))
	// 找到不重复的字符
	for i := range s {
		count := strings.Count(s, string(s[i]))
		if count == 1 {
			return i
		}
	}
	return -1
}

func firstUniqChar2(s string) int {
	counts := make([]int, 26) // 长度为26

	for _, c := range s { // 遍历s，统计每个字符的出现次数
		counts[c-'a']++
	}

	for i, c := range s { // 再次遍历s，找出第一个频次为1的字符的索引
		if counts[c-'a'] == 1 {
			return i
		}
	}

	return -1 // 如果没有找到，返回-1
}

func main() {
	fmt.Println(firstUniqChar("loveleetcode"))
}
